最近比较懒,一直没有更新,耐不住迷妹们在后台频繁的鼓励,今天我们来蹭个热点,了解下二叉树。 最近最火的一个新闻莫过于某著名程序员面试Google被拒,原因是不会反转二叉树。
今天我们就来学习二叉树。
什么是二叉树
二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。
二叉树常被用于实现二叉查找树和二叉堆。
如何定义一个二叉树
根据定义,我们知道二叉树最重要的是根节点,左节点和右节点,我们来实现一个类来代表二叉树:
实现二叉查找树(Binary Search Tree)
首先, 二叉查找树,又称二叉排序树(Binary Sort Tree), 二叉搜索树,
它有如下特点:
(0)它是一颗空树,如果不是,它一定符合下列性质:
(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
先看一个二叉查找树的例子:
下面来实现它:
那么,二叉树如何实现查找呢?根据二叉树的特点,我们知道:
1.如果要查找的值等于根节点的值,成功退出。
2.如果要查找的值小于根节点的值, 递归查找左分支树, 否则,递归查找右分支树,
3.如果发现等同于要查找的值,成功退出。
4.如果子树为空,返回空。
在查找之前,我们先看看如何遍历二叉树:
|
|
查找:
最后,我们来看下大神回答不出来的那个问题, 交换二叉树的左右节点。
由此可以看出, 二叉树的操作,最多的用到的是递归,递归的本质是自己调用自己,下面给一个函数来理解:
递归的理解不尽相同, 不过读者大可不必去关心函数如何一层层调用的,因为
Recursion is the process of solving a problem in terms of smaller versions of the same problem. Since the problem gets smaller each time, the process eventually terminates in a problem (the “base case”) that can be solved directly. Be sure of three things:
- The problem gets smaller each time.
- You include a solution for the base case.
- Each case is handled correctly.